<?php

/**
 * Description of x10_StateManager
 *
 * @author prometheus
 */
class x10_StateManager extends x10_Manager
{
	public $xName = 'Rendszerállapot-kezelő';

	public $state;

	/**
	 * Konstruktor.
	 * @param x10_Config $config
	 * @throws x10_E_Observer_ObservedObjectIsNotObject
	 * @throws x10_E_Observer_ObservedObjectUndefined
	 */
	public function __construct(x10_Config $config=NULL)
	{
		parent::__construct($config);
		$this->registerProvider(new x10_Provider_Descriptor('x10_StateManager_StateProvider'));

		x10::ifDedicated($this);
		x10::dedicate($this);

		$this->autoFillupByConfig();
	}
	
	/**
	 * Megváltoztatja az aktuális rendszerállapotot a megadott nevűre. A váltás
	 * során deaktiválja a régi- és aktiválja az új rendszerállapotot.
	 * @param String $name
	 * @throws x10_GeneralException
	 */
	public function setStateTo($name)
	{
		$success = TRUE;
		if (!is_null($this->state))
		{
			$success = $this[$this->state]->deactivate();
		}
		if ($success and isset($this[$name]))
		{
			$success = $this[$name]->activate();
		}
		if ($success)
		{
			$this->state = $name;
		}
		else
		{
			throw new x10_GeneralException('Az állapot nem váltható át erre: '.$name);
		}
	}

	/**
	 * Visszaadja az aktuális rendszerállapot-szolgáltatót. Ha ez még nincs
	 * meghatározva, NULL-lal tér vissza.
	 * @return x10_StateManager_StateProvider
	 */
	public function getActiveState()
	{
		if (!in_null($this->state))
		{
			return $this[$this->state];
		}
		else
		{
			return NULL;
		}
	}

	protected function autoFillupByConfig()
	{
		$states = $this->config->getConfigKey('states');

		foreach ($states as $stateData)
		{
			$this[$stateData->name] = new x10_StateManager_StateProvider(
				new x10_Config($stateData)
			);
		}
	}
}

?>